#include <iostream>
using namespace std;

struct S { int a; int b; };

int main()
{
    // CASE 1: 显式启用C++11特性
    S s = {0, 1};
    #pragma omp target map(tofrom: s)
    {
        struct Lambda1 {
            S& s;
            Lambda1(S& s_ref) : s(s_ref) {}
            void operator()() { s.a = s.b * 2; }
        };
        Lambda1 lambda1(s);
        s.b += 2;
        lambda1();
    }
    cout << s.a << " " << s.b << endl;

    // CASE 2: 手动展开lambda
    s = {0, 1};
    #pragma omp target data map(tofrom: s)
    {
        #pragma omp target
        {
            S* sp = &s;
            sp->b += 2;
            sp->a = sp->b * 2;
        }
    }
    cout << s.a << " " << s.b << endl;

    // CASE 3: 使用仿函数替代lambda
    s = {0, 1};
    #pragma omp target data map(tofrom: s)
    {
        #pragma omp target
        {
            struct Lambda3 {
                S& s;
                Lambda3(S& s_ref) : s(s_ref) {}
                void operator()() { s.a = s.b * 2; }
            };
            Lambda3 lambda3(s);
            s.b += 2;
            lambda3();
        }
    }
    cout << s.a << " " << s.b << endl;

    // CASE 4: 静态变量处理
    static S ss = {0, 1};
    #pragma omp declare target(ss)
    #pragma omp target map(tofrom: ss)
    {
        struct Lambda4 {
            S& ss_ref;
            Lambda4(S& s) : ss_ref(s) {}
            void operator()() { ss_ref.a = ss_ref.b * 2; }
        };
        Lambda4 lambda4(ss);
        ss.b += 2;
        lambda4();
    }
    cout << ss.a << " " << ss.b << endl;

    return 0;
}